﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using System.Collections.Generic;
using AccesoDatos.DTO;
using AccesoDatos.DAO.Base;
using AccesoDatos.DTO.Base;

namespace AccesoDatos.DAO
{

    /// <summary>
    /// Descripcion breve de ConvocatoriaDAO
    /// </summary>
    public class ConvocatoriaDAO : BaseDAO,IDAO
    {
        #region Singleton

        private static ConvocatoriaDAO instance;

        private ConvocatoriaDAO()
        {
            //Vacio
        }

        /// <summary>
        /// Devuelve una instancia de ConvocatoriaDAO
        /// </summary>
        /// <returns>instancia de ConvocatoriaDAODTO</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static ConvocatoriaDAO GetInstance()
        {
            if (instance == null)
            {
                instance = new ConvocatoriaDAO();
            }

            return instance;
        }

        #endregion

        #region Select

        /// <summary>
        /// Procedimiento almacenado que obtiene el listado de convocatorias en funcion de los valores
        /// de filtro
        /// </summary>
        /// <param name="filtro">Objeto idto que contiene los datos de filtro</param>
        /// <returns>Listado de convocatorias que cumplen con las caracteristicas</returns>
        public List<IDTO> Get(IDTO dto)
        {
            ConvocatoriaDTO filtro = new ConvocatoriaDTO();
            filtro = (ConvocatoriaDTO)dto;
            try
            {
                List<IDTO> lista = new List<IDTO>();
                string sql = "spu_ConvocatoriaDAO_GetConvocatorias";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Año", filtro.Año);
                cmd.Parameters.AddWithValue("@CoAsignatura", filtro.CoAsignatura);
                cmd.Parameters.AddWithValue("@CoAlumno", filtro.CoAlumno);
                cmd.Parameters.AddWithValue("@CalificacionConvocatoria", filtro.CalificacionConvocatoria);
                cmd.Parameters.AddWithValue("@CoConvocatoria", filtro.CoConvocatoria);
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        ConvocatoriaDTO convocatoria = new ConvocatoriaDTO();
                        convocatoria = RellenaBean(dr);
                        lista.Add(convocatoria);
                    }
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        #endregion

        #region Insert,Update,Delete

        /// <summary>
        /// Metodo que inserta un registro en la base de datos
        /// </summary>
        /// <param name="filtro">Objeto DTO que contiene todos los parametros</param>
        public void Insert(IDTO dto)
        {
            ConvocatoriaDTO filtro = new ConvocatoriaDTO();
            filtro = (ConvocatoriaDTO)dto;
            try
            {
                string sql = "spu_ConvocatoriaDAO_Insert";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Año", GetSqlValue(filtro.Año));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CoAsignatura", GetSqlValue(filtro.CoAsignatura));
                cmd.Parameters.AddWithValue("@Observaciones", GetSqlValue(filtro.Observaciones));
                cmd.Parameters.AddWithValue("@CalificacionConvocatoria", GetSqlValue(filtro.CalificacionConvocatoria));
                cmd.Parameters.AddWithValue("@CoConvocatoria", GetSqlValue(filtro.CoConvocatoria));

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que actualiza un registro de la base de datos
        /// </summary>
        /// <param name="filtro">Objeto DTO que contiene los datos para actualizar el registro</param>
        public void Update(IDTO dto)
        {
            ConvocatoriaDTO filtro = new ConvocatoriaDTO();
            filtro = (ConvocatoriaDTO)dto;
            try
            {
                string sql = "spu_ConvocatoriaDTO_Update";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Año", GetSqlValue(filtro.Año));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CoAsignatura", GetSqlValue(filtro.CoAsignatura));
                cmd.Parameters.AddWithValue("@Observaciones", GetSqlValue(filtro.Observaciones));
                cmd.Parameters.AddWithValue("@CalificacionConvocatoria", GetSqlValue(filtro.CalificacionConvocatoria));
                cmd.Parameters.AddWithValue("@CoConvocatoria", GetSqlValue(filtro.CoConvocatoria));
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que elimina un regitro de la base de datos
        /// </summary>
        public void Delete(IDTO dto)
        {
            ConvocatoriaDTO filtro = new ConvocatoriaDTO();
            filtro = (ConvocatoriaDTO)dto;
            try
            {
                string sql = "spu_ConvocatoriaDAO_Delete";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoConvocatoria",GetSqlValue(filtro.Año));
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }

        }

        #endregion

        #region Metodos privados

        /// <summary>
        /// Funcion que rellena el bean con los valores obtenidos en DataReader
        /// </summary>
        /// <param name="dr">DataReader que contiene todos los valores directos de la base de datos</param>
        /// <returns>DTO Relleno con los valores obtenidos</returns>
        private ConvocatoriaDTO RellenaBean(SqlDataReader dr)
        {
            ConvocatoriaDTO bean = new ConvocatoriaDTO();
            bean.Año = this.GetNullableIntFromDataReader(dr, "AÑO");
            bean.CoAsignatura = this.GetNullableIntFromDataReader(dr, "CO_ASIGNATURA");
            bean.CoAlumno = this.GetNullableIntFromDataReader(dr, "CO_ALUMNO");
            bean.CalificacionConvocatoria = this.GetNullableFloatFromDataReader(dr, "CALIFICACIONCONVOCATORIA");
            bean.Observaciones = this.GetStringFromDataReader(dr, "OBSERVACIONES");
            bean.CoConvocatoria = this.GetNullableIntFromDataReader(dr, "CO_CONVOCATORIA");

            return bean;

        }

        #endregion

    }
}